package echo.netty;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * @author： zhangnan
 * @date： 2025/4/9 17:09
 * @description： TODO
 * @modifiedBy：业务处理器类，继承自 ChannelInboundHandlerAdapter，用于处理业务逻辑
 * @version: 1.0
 */
public class BusinessHandler extends ChannelInboundHandlerAdapter {

    // 创建一个日志记录器，用于记录该处理器的相关信息
    private static final Logger logger = Logger.getLogger(BusinessHandler.class.getName());
    // 该处理器的名称，用于在日志中区分不同的业务处理器
    private final String name;

    // 构造函数，接收一个名称参数，用于初始化处理器的名称
    public BusinessHandler(String name) {
        this.name = name;
    }

    // 当通道有数据可读时会调用此方法
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws InterruptedException {
        // 记录开始执行业务逻辑的日志，包含处理器名称和接收到的消息
        logger.log(Level.INFO, "{0} - 开始执行业务逻辑: {1}", new Object[]{name, msg});
        // 模拟业务处理，线程休眠100毫秒
        Thread.sleep(5000);
        // 将处理后的消息原样返回给客户端，writeAndFlush方法会将消息写入通道并刷新缓冲区
        ctx.writeAndFlush(msg);
        // 记录业务逻辑执行完成的日志，包含处理器名称
        logger.log(Level.INFO, "{0} - 业务逻辑执行完成", name);
    }


//    @Override
//    public void channelReadComplete(ChannelHandlerContext ctx){
//        // 将缓冲区中的数据刷新到客户端
//        ctx.flush();
//    }

    // 当通道处理过程中发生异常时会调用此方法
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        // 记录发生异常的日志，包含处理器名称和异常信息
        logger.log(Level.SEVERE, "{0} - 发生异常: ", new Object[]{name, cause});
        // 关闭通道，释放资源
        ctx.close();
    }


}
